nginx set命令——TradeCenter中心Nginx配置
交易中心接口有个需求..
/open/callback/http 这个路径允许外部调用.会有一些外部服务来调用我们的交易中心接口
除此之外互联网访问交易中心域名其他所有资源都拒绝.
目前nginx的配置文件如下:
1 | #隐去多余的配置信息 |
配置思路
这个看似简单的需求,但是配置过程中踩过N多的坑,下面一一道来:
1.添加个location.然后在根路径下使用deny语句:
1 | location /open/callback/http { |
但是由于/open/callback/http是个虚拟路径,最后会被rewrite到根目录下的index.php.(实际上访问任何目录都是访问/index.php)
所以到最后所有请求都会到location /下,无论来自公网的请求是否访问/open/callback/http的URL都会被deny all;
2.通过set打一个tag
1 | #定义一个全局的变量 |
这个思路连nginx的语法测试都没有通过,因为If条件判断下不允许使用allow,deny指令
3.既然不允许allow IP. 那就自行判断IP来源
1 | #定义一个全局的变量 |
同样无法通过Nginx的语法检测,因为Nginx不支持if的 AND OR多重条件判断.
最终方案
既然不支持多重判断,那还是只能通过打tag的方式来判断
1 | #定义一个全局的变量 |
测试
1 | #从互联网访问URL,返回403 |
最终配置参考:
1 | [work@DWD-BETA conf.d]$cat dwd-trade-ssl.conf |
另外一个问题
今天又遇到一个类似的需求.交易中心要求https://m.betaapi.xxxxx.com/open/order/notify接口只允许内网地址访问.
经过测试发现上面的那个配置在这个场景下不管用.
在BETA服务器的msf-open-api.conf配置文件的内加入下列一行.显示ban_url的值:
1 | location ~ .*\.(php|php5)?$ { |
在我电脑终端上请求上面的URL
1 | huangyong@huangyong-Macbook-Pro ~ curl -I https://m.betaapi.xxxxx.com/open/order/notify |
经过反复测试发现if语句要定义在location php下:
1 | location ~ .*\.(php|php5)?$ { |
再次测试发现可以成功的匹配到ban_url变量的值
1 | huangyong@huangyong-Macbook-Pro ~ curl -I https://m.betaapi.xxxxx.com/open/order/notify |
由此可见下面定义的这个rewrite语句没有重定向到location /根目录下.而是直接重定向到location php
1 | set $ban_url 0; |
还有个更简单的配置.直接在path中返回403,.不需要打tag,也不需要转发到根路径或者后端PHP:
1 | location /service { |
注意:
配置完成后,在阿里云SLB里还要配置一下健康检查,将4xx的状态码配置为正常状态码,不然阿里云访问trade.xxxxx.com域名返回403会认为后端服务器异常,从而关闭流量转发.导致所有流量都被SLB屏蔽了.